<?
header( "Content-Type: text/html; Charset=utf-8" );

// ****************************************************************
// ファイル操作クラス
// ****************************************************************
class FileControl {
	// ****************************************************************
	// ファイルとディレクトリの一覧を取得し、
	// 連想配列としてデータを返す。
	// 
	// 引数
	// 第一：ファイルの保存先ディレクトリ（任意 defaultで./dir/）
	// 第二：ブラウザ出力キャラクタセット（任意）
	// 第三：サーバのキャラクタセット
	// 
	// 戻り値
	// ファイルデータの連想配列
	// ****************************************************************
	function file_view($file_dir = "./dir/", $source_cher = "utf-8", $server_cher = "sjis, auto") {

		// ディレクトリのPATHが正しいかチェック
		$file_dir = $this->path_check($file_dir);

		// ディレクトリの権限を変更する
		//chmod($file_dir, 0777);

		$file_array = array();
		$cnt = 0;

		$dir = opendir( $file_dir );
		
		// ファイル探索
		while( $file = readdir( $dir ) ) {
		
			// ファイル名、パス名をブラウザ側キャラクタセットに変換し出力
			$file_name = mb_convert_encoding( $file, $source_cher, $server_cher);
			$file_path = mb_convert_encoding( $file_dir . $file, $source_cher, $server_cher);

			$file_array[$cnt]['name'] = $file_name;
			$file_array[$cnt]['path'] = $file_path;

			// ファイルチェック
			if( is_file( $file_dir . $file ) ) {
				$file_array[$cnt]['type'] = "file";
			} else {
				$file_array[$cnt]['type'] = "dir";
			}

		$cnt++;

		}

		return $file_array;
	}

	// ****************************************************************
	// ファイル名からファイルの中身を取得する
	// 
	// 引数
	// 第一：ファイル名（必須）
	// 第二：ブラウザ出力キャラクタセット（任意 defaultでutf-8）
	// 第三：サーバのキャラクタセット（任意 defaultでsjis）
	// 
	// 戻り値
	// ファイルのデータ
	// ****************************************************************
	function file_read($fname, $source_cher = "utf-8", $server_cher = "sjis") {

		$fname = $this->file_path_check($fname);

		// サーバのキャラクタセットに変換
		$file_name = mb_convert_encoding( $fname, $server_cher, $source_cher);

		// ファイルを開く
		$str = file_get_contents($file_name);

		// サーバのキャラクタセットをブラウザのキャラクタセットに戻す
		//$str = mb_convert_encoding( $str, $source_cher, $server_cher);
		$str = mb_convert_encoding( $str, "UTF-8", "UTF-8, sjis-win, eucjp-win, auto");

		return $str;
	}


	// ****************************************************************
	// 渡されたディレクトリのPATHが正しいかチェックを行い、
	// 不正なPATHを正しいPATHに置き換える
	// 
	// 引数
	// 第一：ディレクトリのPATH（必須）
	// 
	// 戻り値
	// 適切に成形されたディレクトリPATH
	// ****************************************************************
	function path_check($path) {
		$parent = "..";

		// .. で親ディレクトリに上がろうとしている
		if( !(strpos($path, $parent) === false) ) {
//			return "パスが正しくありません。";
			while(!(strpos($path, $parent) === false)) {
//				$path = substr($path, strpos($path, $parent), strlen($parent));

				$path = substr($path, 0, strpos($path, $parent)) . substr($path, strpos($path, $parent) + strlen($parent), strlen($path));
//				, strlen($parent));
			}
		}

		// .から始まっていない
		if(!(substr($path, 0, 1) === ".")) {
			if(!(substr($path, 0, 1) === "/")) {
				$path = "/" . $path;
			}
			$path = "." . $path;
		}

		// ファイルかディレクトリか
		if(is_dir( $path )) {
			// "/" で終わっていない
			if( !(substr($path, -1) === "/") ) {
				$path = $path . "/";
			}
		}

		// 正規表現でスラッシュ "/" の連続文字をなくす
		$pattern = '/(\/+)/i';
		$replacement = '/';
		$path = preg_replace($pattern, $replacement, $path);

		return $path;

	}


	// ****************************************************************
	// 渡されたディレクトリのPATHが正しいかチェックを行い、
	// 不正なPATHを正しいPATHに置き換える
	// 
	// 引数
	// 第一：ディレクトリのPATH（必須）
	// 
	// 戻り値
	// 適切に成形されたディレクトリPATH
	// ****************************************************************
	function file_path_check($path) {
		$parent = "..";

		// .. で親ディレクトリに上がろうとしている
		if( !(strpos($path, $parent) === false) ) {
//			return "パスが正しくありません。";
			while(!(strpos($path, $parent) === false)) {
//				$path = substr($path, strpos($path, $parent), strlen($parent));

				$path = substr($path, 0, strpos($path, $parent)) . substr($path, strpos($path, $parent) + strlen($parent), strlen($path));
//				, strlen($parent));
			}
		}

		// .から始まっていない
		if(!(substr($path, 0, 1) === ".")) {
			if(!(substr($path, 0, 1) === "/")) {
				$path = "/" . $path;
			}
			$path = "." . $path;
		}

		// ファイルかディレクトリか
		if(is_file( $path )) {
			// ファイル
		}

		// 正規表現でスラッシュ "/" の連続文字をなくす
		$pattern = '/(\/+)/i';
		$replacement = '/';
		$path = preg_replace($pattern, $replacement, $path);

		return $path;

	}


	// ****************************************************************
	// 渡されたファイルのPATHと文字列を元に、ファイルを編集する
	// 
	// 引数
	// 第一：ファイルのPATH（必須）
	// 第二：ファイルに書きこむ文字列（必須）
	// 
	// 戻り値
	// 成功した場合にtrue そうでない場合はfalse
	// ****************************************************************
	function text_edit($path, $str, $char_set="UTF-8", $server_cher="SJIS") {

		$str = urldecode($str);

		//$str = mb_convert_encoding( $str, $char_setcher, "AUTO");
		$str = mb_convert_encoding( $str, $char_set, "AUTO");

		// サーバのキャラクタセットに変換
		$path = mb_convert_encoding( $path, $server_cher, "UTF-8");


		$message = "<message>";

		if (!$fp = fopen($path, "w+")) {
			//echo "Cannot open file ($path)";
			$message .= "Cannot open file ($path)";
			$message .= "</message>";
			return $message;
		}

		// オープンしたファイルに$somecontentを書き込みます
		if (fwrite($fp, $str) === FALSE) {
			$message .= "Cannot write to file ($path)";
			$message .= "</message>";
			return $message;
		}
		$message .= "Complete";
		$message .= "</message>";

		fclose($fp);

		return $message;
	}


	// ****************************************************************
	// 渡された crossdomain.xml からアクセス許可ドメインを取得し、
	// 配列として返す
	// 
	// 引数
	// 第一：crossdomain.xmlへのPATH（必須）
	// 
	// 戻り値
	// アクセス許可ドメインを格納した配列
	// ****************************************************************
	function get_allow_domain($path) {

		// crossdomain.xml からXMLで取得
		$xml = $this->file_read($path);

		// xmlを読み込む
		$feed = simplexml_load_string($xml);

		// allow-access-fromだけを読み込む
		$feed = $feed->{'allow-access-from'};

		$cnt = 0;
		// 要素数分ループ
		foreach($feed as $feed_value) {

			// 要素から属性を取りだす
			foreach($feed_value->attributes() as $attribute) {

				// 属性を配列に保存
				$array[$cnt] = strtolower((string)$attribute);
			}

			$cnt++;

		}

		return $array;

	}


	// ****************************************************************
	// 渡されたディレクトリのPATHを元に、新しくディレクトリを作成する
	// 
	// 引数
	// 第一：ディレクトリのPATH（必須）
	// 
	// 戻り値
	// 成功した場合にtrue そうでない場合はfalse
	// ****************************************************************
	function make_dir($path) {

		// ディレクトリを作成する
		if ( mkdir( $path ) ) {
			return true;
		} else {
			return false;
		}
 	}


}

// sample

/*
$fc = new FileControl();
$arr = $fc->file_view("../../../../");
print "<pre>";
print_r($arr);
print count($arr) . "\n";
//print $fc->file_read("../../../../新しいテキスト ドキュメント.txt");
print "</pre>";
//$fc->text_edit("./wryyy.txt", "無駄無駄無駄無駄ァ！");
$fc=NULL;
*/
?>